package com.smh.a01GenericsDemo1;

import java.util.ArrayList;

public class GenericsDemo5 {
    public static void main(String[] args) {
//        ArrayList<Fu> list = new ArrayList<>();
//        ArrayList<Zi> list1 = new ArrayList<>();
//        ArrayList<Student> list2 = new ArrayList<>();
////        method(list2);
//        method(list);
//        method(list1);
        ArrayList<Ye> arrayList = new ArrayList<>();
        ArrayList<Object> arrayList1 = new ArrayList<>();

        method(arrayList);
        method(arrayList1);


    }
    /*
    *此时，泛型里面写的是什么类型，那么只能传递什么类型的数据。
    *弊端:
    利用泛型方法有一个小弊端，此时他可以接受任意的数据类型Student
    Ye Fu zi
    希望:本方法虽然不确定类型，但是以后我希望只能传递Ye Fu zi
    此时我们就可以使用泛型的通配符:
     ?也表示不确定的类型
     他可以进行类型的限定
     ?extendsE:表示可以传递E或者E所有的子类类型
     ?super E:表示可以传递E或E所有的父类类型
     */

    //    public static void method(ArrayList<? extends Ye> list){
//
//    }
    //只能传递Ye和Ye的父类
    /*
    * 应用场景:1.如果我们在定义类、方法、接口的时候，
    * 如果类型不确定，就可以定义泛型类、泛型方法、泛型接口。
    * 2.如果类型不确定，但是能知道以后只能传递某个继承体系中的，
    * 就可以泛型的通配符泛型的通配符:
        关键点:可以限定类型的范围。
    *
    * */
    public static void method(ArrayList<? super Ye> list) {

    }

    static class Ye {

    }

    static class Fu extends Ye {

    }

    static class Zi extends Fu {

    }

    static class Student {
    }
}
